/* 
 * File:   Lista.cpp
 * Author: Pedro
 * 
 * Created on 13 de Agosto de 2010, 15:26
 */

#include "../Classe/Lista.h"
#include <stdlib.h>
#include <iostream>

using namespace std;

//criar a lista
Lista::Lista()
{
    this->primeiro = NULL;
    this->ultimo = NULL;
    this->numElementos = 0;
}

Lista::Lista(const Lista& orig)
{
}

Lista::~Lista()
{
}

//inserir na lista
void Lista::Insere(Campo valor)
{
    NoLista *aux = new NoLista;
    aux->valor = valor;
    aux->Proximo = NULL;

    if (this->numElementos == 0) {
        this->primeiro = aux;
        this->ultimo = aux;
    } else {
        this->ultimo->Proximo = aux;
        this->ultimo = aux;
    }

    this->numElementos += 1;
}

//exiir a lista
void Lista::ExibeLista()
{
    NoLista *ponteiro = this->primeiro;

    while(ponteiro!=NULL)
    {
        cout << ponteiro->valor.lexema << "|" << ponteiro->valor.token << "->";
        ponteiro = ponteiro->Proximo;   
    }
}

//remove elemento da lista
void Lista::RemoveLista(Campo valor)
{
    NoLista *ponteiro = this->primeiro;
    NoLista *sai;
    sai = NULL;
    while(ponteiro!=NULL)
    {

        if(ponteiro->valor==valor)
        {
           sai = ponteiro;
           this->primeiro = ponteiro->Proximo;
           break;
        }else if(ponteiro->Proximo != NULL && ponteiro->Proximo->valor==valor)
        {

            sai = ponteiro->Proximo;
            ponteiro->Proximo = ponteiro->Proximo->Proximo;

            if(ponteiro->Proximo==NULL)
                this->ultimo = ponteiro;
            
            break;
        }
        ponteiro = ponteiro->Proximo;
    }
    if(sai!=NULL)
    {
        delete(sai);
        this->numElementos = this->numElementos - 1;
    }
}

//sobrecarrega operador << para inserir na lista
void Lista::operator<< (Campo valor)
{
    this->Insere(valor);
}

//sobrecarrega operador >> para remover da lista
void Lista::operator>> (Campo valor)
{
    this->RemoveLista(valor);
}

//pesquisar na lista pelo token
Campo* Lista::procuraPor(int token)
{

    Campo *retorno = NULL;
    NoLista *ponteiro = this->primeiro;

    while(ponteiro!=NULL){

        if(ponteiro->valor.token == token){

            retorno = new Campo();
            *retorno = ponteiro->valor;
            return retorno;
        }
         ponteiro = ponteiro->Proximo;

    }
    return NULL;

}

//pesquisar na lista pelo valor do lexema
Campo* Lista::procuraPor(string lexema)
{

    Campo *retorno = NULL;
    NoLista *ponteiro;
    ponteiro = this->primeiro;

    while(ponteiro!=NULL){

        if(ponteiro->valor.lexema == lexema){

            retorno = new Campo();
            *retorno = ponteiro->valor;
            return retorno;
        }
         ponteiro = ponteiro->Proximo;

    }
    return NULL;
}

//exibir a lista
bool Lista::existeNaLista(int token)
{
    return (this->procuraPor(token)!=NULL);
}
//varificar se existe na lista
bool Lista::existeNaLista(string lexema)
{
    return (this->procuraPor(lexema)!=NULL);
}
